#ifndef MATRIX_H
#define MATRIX_H

#include "Maths.h"
#include <stdio.h>

namespace Math {
/**
 * Classe de Matrice 4x4
 *
 * Matrice composée de 16 floats avec les opérations standards
 * vers matrices et elemwises.
 */
class MATH_API Matrix
{
 public:
    /**
     * Constructeur
     */
    Matrix();
    
    /**
     * Destructeur
     */
    ~Matrix() {}
    
    /**
     * Accède à la valeur de la matrice situé à la position donné
     * @param row Rangée
     * @param col Colonne
     * @return La valeur
     */
    float& operator()(size_t row, size_t col);
    
    /**
     * Accède à la valeur de la matrice situé à la position donné
     * @param row Rangée
     * @param col Colonne
     * @return La valeur
     */
    float operator()(size_t row, size_t col) const;
    
    /**
     * Additionne une matrice à celle-ci
     * @param rhs La matrice à additionner
     */
    Matrix operator+(const Matrix &rhs);

    /**
     * Soustraie une matrice à celle-ci
     * @param rhs La matrice à soustraire
     */
    Matrix operator-(const Matrix &rhs);

    /**
     * Multiplie une matrice à celle-ci par la droite
     * @param rhs La matrice à multiplier
     */
    Matrix operator*(const Matrix &rhs);
    
    /**
     * Multiplie un scalaire à la matrice
     * @param rhs Le scalaire à multiplier
     */
    Matrix operator*(const float &rhs);
    
    /**
     * Divise un scalaire à la matrice
     * @param rhs le scalaire
     */
    Matrix operator/(const float &rhs);
    
    /**
     * ajoute un scalaire à la matrice
     * @param rhs le scalaire
     */
    Matrix operator+(const float &rhs);

    /**
     * Vérifie l'égalité entre deux matrices
     * @param rhs matrice a comparer
     */
    bool operator==(Matrix const& rhs);

    /**
     * Change la matrice en matrice identitaire in-place
     */
    void identity();
    
    /**
     * inverse la matrice in-place
     */
    void reverse();
    
 private:
    float m_Data[16]; ///< membres de la matrice
}; // Class

}
#endif
